using Godot;
using System.Collections.Generic; // 需要用到 List

public partial class BridgeGun : Node2D
{
    [Export] public PackedScene BulletScene;    // 拖入 AnchorBullet.tscn
    [Export] public PackedScene AnchorScene;    // 拖入 Anchor.tscn
    [Export] public PackedScene BridgeScene;    // 拖入 HoloBridge.tscn

    // [Export] public PlayerColor CurrentGunColor = PlayerColor.Red;
    [Export] public Node2D MuzzlePoint;         // 枪口位置（子弹生成点）

    [Export] public Vector2 offset = new Vector2(0, 0); // 子弹生成偏移

    // 管理场上的锚点 (使用 List 实现 FIFO 队列)
    private List<Sprite2D> _activeAnchors = new List<Sprite2D>();

    // 唯一的桥实例
    private HoloBridge _activeBridge;

    public override void _Ready()
    {
        // 实例化桥（一开始隐藏）
        _activeBridge = BridgeScene.Instantiate<HoloBridge>();
        _activeBridge.Visible = false;
        Node levelRoot = GetTree().CurrentScene;
        levelRoot.CallDeferred(Node.MethodName.AddChild, _activeBridge);
    }

    public override void _Process(double delta)
    {
        LookAt(GetGlobalMousePosition());

        // if (Input.IsActionJustPressed("debug_q"))
        // {
        //     SwitchColor();
        // }

        // 统一使用左键射击 (fire_a)
        if (Input.IsActionJustPressed("fire_a"))
        {
            Shoot();
        }
    }

    // private void SwitchColor()
    // {
    //     // CurrentGunColor = (CurrentGunColor == PlayerColor.Red) ? PlayerColor.Blue : PlayerColor.Red;
    //     Cfg.CurPlayerColor = Cfg.NextColor(Cfg.CurPlayerColor);

    //     // 视觉反馈：改变枪的颜色
    //     Modulate = Cfg.GetColorValue(Cfg.CurPlayerColor);
    // }

    private void Shoot()
    {
        if (BulletScene == null) return;

        // 生成子弹
        var bullet = BulletScene.Instantiate<AnchorBullet>();
        GetTree().CurrentScene.AddChild(bullet);

        // 计算射击方向
        Vector2 spawnPos = MuzzlePoint.GlobalPosition + offset;
        Vector2 dir = (GetGlobalMousePosition() - spawnPos).Normalized();

        // 初始化子弹
        bullet.Setup(spawnPos, dir, Cfg.CurPlayerColor, this);
    }

    // --- 回调函数：给子弹调用的 ---
    public void OnBulletHit(Vector2 hitPos, PlayerColor bulletColor)
    {
        // 1. 生成新的锚点视觉
        CreateAnchorAt(hitPos, bulletColor);

        // 2. 尝试更新桥
        UpdateBridgeLogic(bulletColor);
    }

    private void CreateAnchorAt(Vector2 pos, PlayerColor color)
    {
        // 实例化新锚点
        Sprite2D newAnchor = AnchorScene.Instantiate<Sprite2D>();
        GetTree().CurrentScene.CallDeferred(Node.MethodName.AddChild, newAnchor);

        newAnchor.GlobalPosition = pos;
        newAnchor.Modulate = Cfg.GetColorValue(color);

        // 加入列表
        _activeAnchors.Add(newAnchor);

        // FIFO 逻辑：如果超过2个，移除最老的那个
        if (_activeAnchors.Count > 2)
        {
            Sprite2D oldAnchor = _activeAnchors[0];
            _activeAnchors.RemoveAt(0);
            oldAnchor.QueueFree(); // 彻底销毁旧锚点
        }
    }

    private void UpdateBridgeLogic(PlayerColor color)
    {
        // 只有当场上有 2 个锚点时才显示桥
        if (_activeAnchors.Count == 2)
        {
            Vector2 posA = _activeAnchors[0].GlobalPosition;
            Vector2 posB = _activeAnchors[1].GlobalPosition;

            _activeBridge.Visible = true;

            // 这里有个设计选择：桥的颜色跟随谁？
            // 方案A：跟随当前枪的颜色 (玩家控制权更大)
            // 方案B：跟随最新那个锚点的颜色
            // 我们暂时用方案A
            _activeBridge.UpdateBridge(posA, posB, color);
            // 方案B
            // _activeBridge.UpdateBridge(posA, posB, _activeAnchors[1].ColorType);
        }
        else
        {
            // 只有一个点，无法连线，隐藏桥
            _activeBridge.Visible = false;
            // 记得禁用碰撞，防止隐形墙
            _activeBridge.DisableBridge();
        }
    }
}